/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package projetofinal;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.DecimalFormat;
import javax.swing.*;
import javax.swing.border.Border;
import javax.swing.border.EtchedBorder;
import javax.swing.text.MaskFormatter;

/**
 *
 * @author Will
 */
public class CadastroFuncionario extends JInternalFrame {
    
    private final int preferedHeight = 28;
    
    private JPanel jpframe, jpmenu, jpfields;
    
    private JButton btnProcessar, btnNovo, btnExcluir, btnFechar, btnAjuda;
    private JLabel lblCodigoFuncionario, lblNomeFuncionario, lblCpf, 
            lblSexo, lblCargo, lblSalario, lblFerias;
    private JTextField txCodigoFuncionario, txNomeFuncionario;
    private JFormattedTextField txCpf, txSalario;
    private JComboBox cbFerias, cbCargo;
    private ButtonGroup bgroupsexo;
    private JRadioButton[] arrayRadio = new JRadioButton[2];
    
    //Define bordas em relevo caixa baixa para os JPanels internos
    private Border loweredEtched = BorderFactory.createEtchedBorder(EtchedBorder.LOWERED);
    
    //Layouts da página
    FlowLayout experimentLayout = new FlowLayout();
    
    //Variaveis que armazenam os valores que vem do banco
    private String vlCodigoBd = "", vlNomeBd = "", vlCpfBd = "", vlSexoBd = "";
    int vlFeriasBd, vlCargoBd;
    double vlSalarioBd;
    
    public CadastroFuncionario(){
        initComponents(null);  
    }
    
    public CadastroFuncionario(String nmFrame){
        super(nmFrame);
        initComponents(null);
    }
    
    public CadastroFuncionario(String nmFrame, Object vlCodigo){
        super(nmFrame);
        initComponents(vlCodigo);
    }

    private void initComponents(Object vlCodigo) {
        setClosable(true);
        setMaximizable(true);
        setIconifiable(true);
        setResizable(true);
        setVisible(true);
        
        if(vlCodigo != null){
            BancoDados bd = new BancoDados();
            ResultSet rs = bd.pesquisaFuncionarios(vlCodigo.toString(), "");
            try{
                while(rs.next()){
                   vlCodigoBd   = rs.getString("codigo");
                   vlNomeBd     = rs.getString("nome");
                   vlCpfBd      = rs.getString("cpf");
                   vlSexoBd     = rs.getString("sexo");
                   vlFeriasBd   = rs.getInt("ferias");
                   vlCargoBd    = rs.getInt("cod_cargo");
                   vlSalarioBd  = rs.getDouble("salario");
                }
            }catch(SQLException sqlex){
                JOptionPane.showMessageDialog(null, sqlex.toString(), "Aviso", JOptionPane.WARNING_MESSAGE);
            }
        }
        
        //Cria um JPanel principal sem bordas para guardar o conteúdo da tela (container)
        jpframe = new JPanel();
        jpframe.setBorder(BorderFactory.createEmptyBorder(10, 10, 20, 10));
        BoxLayout bl = new BoxLayout(jpframe, BoxLayout.PAGE_AXIS);
        jpframe.setLayout(bl);
        
        //Cria um JPanel para alocar os componentes de menu da tela
        jpmenu = new JPanel();
        jpmenu.setLayout(experimentLayout);
        experimentLayout.setAlignment(FlowLayout.TRAILING);
        jpmenu.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
        jpmenu.setBorder(loweredEtched);
        jpmenu.setVisible(true);
        
        //BOTÕES DO JPANEL MENU
        btnProcessar    = new JButton("Processar");
        
        btnProcessar.addActionListener(new java.awt.event.ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                BancoDados bd = new BancoDados();
                
                if(verificaCampos()){
                    String sexo;
                    int ferias = cbFerias.getSelectedIndex();
                    
                    if(arrayRadio[0].isSelected()){
                        sexo = "M";
                    }else{
                        sexo = "F";
                    }
                    
                    double salario;
                    String cpf = txCpf.getText().trim().replaceAll("-", "").replace(".","");
                    salario = Double.parseDouble(txSalario.getText().trim().replace(".","").replace(",","."));
                    
                    if(txCodigoFuncionario.getText().trim().length() > 0){
                        int resInsert = bd.atualizaFuncionario(txNomeFuncionario.getText().trim(), cpf,
                                sexo, cbCargo.getSelectedIndex(), salario, ferias, txCodigoFuncionario.getText().trim());

                        if(resInsert != 0){
                            JOptionPane.showMessageDialog(null, "Registro alterado com sucesso!");
                        }else{
                            JOptionPane.showMessageDialog(null, "A inserção falhou", "Aviso", JOptionPane.WARNING_MESSAGE);
                        }
                    }else{
                        int resInsert = bd.insereFuncionarios(txNomeFuncionario.getText().trim(), cpf,
                                sexo, cbCargo.getSelectedIndex(), salario, cbFerias.getSelectedIndex());

                        if(resInsert != 0){
                            JOptionPane.showMessageDialog(null, "Registro inserido com sucesso!");
                            DecimalFormat quatroDigitos = new DecimalFormat("0000");
                            String strAux = quatroDigitos.format(resInsert);
                            txCodigoFuncionario.setText(strAux);
                        }else{
                            JOptionPane.showMessageDialog(null, "A inserção falhou", "Aviso", JOptionPane.WARNING_MESSAGE);
                        }
                    }
                    
                }else{
                    JOptionPane.showMessageDialog(null, "Porfavor preencha os campos obrigatórios", "Aviso", JOptionPane.WARNING_MESSAGE);
                }
                
            }
        });
        
        btnNovo = new JButton("Novo");
        
        btnNovo.addActionListener(new java.awt.event.ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                getContentPane().setName("Cadastro de funcionários");
                limparCampos();
            }
        });
        
        btnExcluir      = new JButton("Excluir");
        
        btnExcluir.addActionListener(new java.awt.event.ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                
                int option = JOptionPane.showConfirmDialog(null, "Deseja realmente excluir este registro?");
                
                if(option == JOptionPane.YES_OPTION){
                    BancoDados bd = new BancoDados();
                    if(txCodigoFuncionario.getText().trim().length() > 0){
                            int resInsert = bd.deletaFuncionario(txCodigoFuncionario.getText().trim());

                            if(resInsert != 0){
                                JOptionPane.showMessageDialog(null, "Registro excluido com sucesso!");
                                limparCampos();
                            }else{
                                JOptionPane.showMessageDialog(null, "Erro ao deletar registro", "Aviso", JOptionPane.WARNING_MESSAGE);
                            }
                        }else{
                        JOptionPane.showMessageDialog(null, "Código inexistente para deleção", "Aviso", JOptionPane.WARNING_MESSAGE);
                    }
                }
            }
        });
        
        btnFechar       = new JButton("Fechar");
        
        btnFechar.addActionListener(new java.awt.event.ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                dispose();
            }
        });
        
        btnAjuda        = new JButton("Ajuda");
        
        btnAjuda.addActionListener(new java.awt.event.ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                String txAjuda, titleWindow;
                if(txCodigoFuncionario.getText().trim().length() > 0){
                    titleWindow = "Tela tela de edição do funcionário";
                }else{
                    titleWindow = "Tela tela de cadastro do funcionário";
                }
                
                txAjuda = "Botão Processar : Salva as informações do funcionário.\n\n"
                            + "Botão Novo : Limpa os dados na tela para cadastrar um novo funcionário.\n"
                            + "Botão Excluir : Exclui os dados do funcionário do banco.\n"
                            + "Botão Fechar : Fecha a tela de edição do funcionário.\n"
                            + "Botão Ajuda : Mostra as funcionalidades da tela.\n";
                JOptionPane.showMessageDialog(null, txAjuda, titleWindow, JOptionPane.INFORMATION_MESSAGE);
            }
        });
        
        jpmenu.add(btnAjuda);
        jpmenu.add(btnFechar);
        jpmenu.add(btnExcluir);
        jpmenu.add(btnNovo);
        jpmenu.add(btnProcessar);
        
        jpframe.add(jpmenu);
        
        //Adiciona um espaçamento entre os containers dentro do jpframe
        jpframe.add(Box.createRigidArea(new Dimension(0, 30)));
        
        lblCodigoFuncionario    = new JLabel("Código do funcionário: ");
        lblNomeFuncionario      = new JLabel("Nome do funcionário: ");
        lblCpf         = new JLabel("CPF: ");
        lblCargo       = new JLabel("Cargo: ");
        lblFerias      = new JLabel("Em férias: ");
        lblSexo             = new JLabel("Sexo: ");
        lblSalario   = new JLabel("Salário: ");
        
        txCodigoFuncionario = new JTextField();
        txCodigoFuncionario.setText(vlCodigoBd);
        txCodigoFuncionario.setEditable(false);
        txCodigoFuncionario.setPreferredSize(new Dimension(60, preferedHeight));
        
        txNomeFuncionario = new JTextField();
        txNomeFuncionario.setText(vlNomeBd);
        txNomeFuncionario.setPreferredSize(new Dimension(300, preferedHeight));
        
        txCpf = new JFormattedTextField(createFormatter("###-###-###.##"));
        txCpf.setText(vlCpfBd);
        txCpf.setPreferredSize(new Dimension(400, preferedHeight));
        
        txSalario = new JFormattedTextField(createFormatter("########"));
        txSalario.setFocusLostBehavior(JFormattedTextField.COMMIT);
        txSalario.setText(Double.toString(vlSalarioBd).replace(".",""));
        txSalario.setPreferredSize(new Dimension(140, preferedHeight));
        
        cbFerias = new JComboBox();
        cbFerias.addItem("Não");
        cbFerias.addItem("Sim");
        
        cbFerias.setSelectedIndex(vlFeriasBd);
        
        cbCargo = new JComboBox();
        cbCargo.addItem("");
        cbCargo.addItem("Cargo 1");
        cbCargo.addItem("Cargo 2");
        cbCargo.addItem("Cargo 3");
        cbCargo.addItem("Cargo 4");
        
        cbCargo.setSelectedIndex(vlCargoBd);
        
        jpfields = new JPanel();
        jpfields.setLayout(new GridBagLayout());
        jpfields.setBorder(loweredEtched);
        
        addLabelTextRows(lblCodigoFuncionario, txCodigoFuncionario, jpfields);
        addLabelTextRows(lblNomeFuncionario, txNomeFuncionario, jpfields);
        addLabelTextRows(lblCpf, txCpf, jpfields);
        
        bgroupsexo = new ButtonGroup();
        arrayRadio[0] = new JRadioButton("Masculino");
        arrayRadio[1] = new JRadioButton("Feminino");
        switch (vlSexoBd) {
            case "M":
                arrayRadio[0].setSelected(true);
                break;
            case "F":
                arrayRadio[1].setSelected(true);
                break;
            default:
                break;
        }
        
        addLabelRadioRows(lblSexo, arrayRadio, bgroupsexo, jpfields);
        
        addLabelTextRows(lblSalario, txSalario, jpfields);
        addLabelComboRows(lblCargo, cbCargo, jpfields);
        addLabelComboRows(lblFerias, cbFerias, jpfields);
        
        jpframe.add(jpfields);
        
        getContentPane().add(jpframe);  
        pack();
    }
    
    /**
     * Função que adiciona uma linha com a label e um textfield ao container informado
     * @param label
     * @param textField
     * @param container 
     */
    private void addLabelTextRows(JLabel label,
                                  JTextField textField,
                                  Container container) {
        GridBagConstraints c = new GridBagConstraints();
        c.anchor = GridBagConstraints.EAST;
        c.insets = new Insets(5, 5, 5, 5);
        
        c.gridwidth = GridBagConstraints.RELATIVE; //next-to-last
        c.fill = GridBagConstraints.NONE;      //reset to default
        c.weightx = 0.0;                       //reset to default
        container.add(label, c);

        c.gridwidth = GridBagConstraints.REMAINDER;     //end row
        c.anchor = GridBagConstraints.WEST;
        container.add(textField, c);
    }
    
    /**
     * Função que adiciona uma linha com a label e um combobox ao container informado
     * @param label
     * @param comboField
     * @param container 
     */
    private void addLabelComboRows(JLabel label,
                                  JComboBox comboField,
                                  Container container) {
        GridBagConstraints c = new GridBagConstraints();
        c.anchor = GridBagConstraints.EAST;
        c.insets = new Insets(5, 5, 5, 5);
 
        c.gridwidth = GridBagConstraints.RELATIVE; //next-to-last
        c.fill = GridBagConstraints.NONE;      //reset to default
        c.weightx = 0.0;                       //reset to default
        container.add(label, c);

        c.gridwidth = GridBagConstraints.REMAINDER;     //end row
        c.anchor = GridBagConstraints.WEST;
        container.add(comboField, c);
    }
    
     /**
     * Função que adiciona uma linha com a label e os radioFields ao container informado
     * @param label
     * @param radioFields
     * @param btnGroup
     * @param container 
     */
    private void addLabelRadioRows(JLabel label,
                                  JRadioButton[] radioFields,
                                  ButtonGroup btnGroup,
                                  Container container) {
        //Criamos um novopainel que armazenara os radiobuttons
        JPanel jpContainer = new JPanel();
        GridBagLayout layoutContainer = new GridBagLayout();
        jpContainer.setLayout(layoutContainer);
        
        GridBagConstraints c = new GridBagConstraints();
        c.anchor = GridBagConstraints.EAST;
        c.insets = new Insets(5, 5, 5, 5);
 
        c.gridwidth = GridBagConstraints.RELATIVE; //next-to-last
        c.fill = GridBagConstraints.NONE;      //reset to default
        c.weightx = 0.0;                       //reset to default
        container.add(label, c);

        for(int i = 0; i < radioFields.length; i++){
            btnGroup.add(radioFields[i]);
        }
        
        c.anchor = GridBagConstraints.WEST;
        for(int i = 0; i < radioFields.length; i++){
            jpContainer.add(radioFields[i]);
        }
        c.gridwidth = GridBagConstraints.REMAINDER; 
        c.anchor = GridBagConstraints.WEST;
        container.add(jpContainer, c);
    }
    
    /**
     * Verifica se os campos obrigatórios foram preenchidos
     * @return boolean validaCampos
     */
    public boolean verificaCampos(){
        boolean validaCampos = true;
        
        if(txNomeFuncionario.getText().trim().equals("") || txCpf.getText().trim().equals("")){
            validaCampos = false;
        }
        
        return validaCampos;
    }
    
    public void limparCampos(){
        txCodigoFuncionario.setText("");
        txNomeFuncionario.setText("");
        txCpf.setText("");
        cbFerias.setSelectedIndex(0);
        txSalario.setText("");
        cbCargo.setSelectedIndex(0);
        bgroupsexo.clearSelection();
    }
    
    /**
     * Cria a máscara para formatar campos
     * @param s
     * @return MaskFormatter formatter || null
     */
    public MaskFormatter createFormatter(String s) {
        MaskFormatter formatter = null;
        try {
            formatter = new MaskFormatter(s);
        } catch (java.text.ParseException exc) {
            System.err.println("Formato incorreto: " + exc.getMessage());
        }
        return formatter;
    }
    
}
